﻿using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using AudiPyme.BLL;
using System.IO;
using System.Data;
using AudiPyme.DAL;

namespace AudiPyme.UI
{
    public partial class EmpresaNivMadurezActualGest : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                //Si es la primera vez que se carga la página inicializamos los controles
                if (!IsPostBack)
                {
                    ModeloContainer agenteBD = new ModeloContainer();
                    int IdEmpresa = DatosEmpresa();
                    if (IdEmpresa != -1)
                    {
                        int NivelMadurezActual = 0;
                        NivelMadurezActual = EmpresasFactory.MadurezActualEmpresa(IdEmpresa);
                        if (NivelMadurezActual != 0)
                        {
                            PnlGV.Visible = false;
                            MuestraMensajeRedirige("La empresa ya tiene un Nivel de Madurez Calculado. Se redigira automaticamente a la pagina de gestión", "ControlesPrincipal");
                        }
                        else
                        {
                            BtnInsertar.Visible = true;
                            //Número de controles seleccionados actualmente
                            int nControlesOn = 0;
                            //Numero de controles que hay actualmente en la BD
                            int numeroControles = ControlesFactory.NumeroTotalControles();
                            //Lista de enteros que almacena que controles han sido seleccionados
                            List<int> Contador = new List<int>(numeroControles);
                            //Inicializamos la lista
                            for (int i = 0; i < Contador.Capacity; i++)
                            {
                                Contador.Insert(i, 0);
                            }
                            //Recogemos los controles de la base de datos
                            List<Controles> LControles = ControlesFactory.RecogeControles();
                            GridView1.DataSource = LControles;
                            DataBind();
                            //Creamos e inicializamos el control que va a recoger que selección del RadioButtonList se ha hecho
                            //de cada control
                            List<ControlesCheckList> CheckList = new List<ControlesCheckList>(133);
                            for (int i = 0; i < CheckList.Capacity; i++)
                            {
                                CheckList.Insert(i, new ControlesCheckList());
                            }
                            //Iniciamos el numero de controles en la label correspondiente
                            LblNTotContr.Text = numeroControles.ToString();
                            //Guardamos en variables de sesión
                            Session["CheckList"] = CheckList;
                            Session["Contador"] = Contador;
                            Session["nControlesOn"] = nControlesOn;
                        }
                    }
                }
            }
            catch (Exception e1)
            {
                MuestraMensaje("Error a la hora de cargar la página. " + e1.Message);
                PnlGV.Visible = false;
            }
        }

        //Método que se ejecuta al evento de cliquear una de las opciones del RadioButtonList en cada control
        protected void Index_Changed(Object sender, EventArgs e)
        {
            try
            {
                //Recuperamos las variables de sesión
                //Recogemos el valor de los controles seleccionados en las otras paginas del GridView
                //con la variable de sesión nControlesOn
                int IdEmpresa = DatosEmpresa();
                if (IdEmpresa != -1)
                {
                    int nControlesOn = (int)Session["nControlesOn"];
                    List<int> Contador = (List<int>)Session["Contador"];
                    List<ControlesCheckList> CheckList = (List<ControlesCheckList>)Session["Checklist"];
                    //Recorremos la página que el gridview muestra
                    foreach (GridViewRow row in GridView1.Rows)
                    {
                        //Recogemos el control RadioButtonList de cada fila del gridview
                        RadioButtonList Rbl = (RadioButtonList)row.FindControl("RadioButtonList1");
                        //Recogemos el Id del Control de cada fila
                        int IdControl;
                        int.TryParse(GridView1.Rows[row.RowIndex].Cells[1].Text, out IdControl);
                        if (Rbl.SelectedItem != null)
                        {
                            //Recogemos el control, el valor seleccionado y el nivel de madurez al que pertenece ese control
                            String Control = GridView1.Rows[row.RowIndex].Cells[3].Text;
                            String ValorSelec = Rbl.SelectedItem.Text;
                            int NivelMadurez;
                            int.TryParse(GridView1.Rows[row.RowIndex].Cells[5].Text, out NivelMadurez);
                            //Creamos el objeto ControlCheckList con los valores y lo insertamos en la lista
                            ControlesCheckList ControlChequeado = new ControlesCheckList(IdEmpresa, IdControl, ValorSelec, NivelMadurez);
                            CheckList[IdControl - 1] = ControlChequeado;
                        }
                        //Si es la primera vez que se elige una opción en dicho control, aumentamos el contador
                        //y marcamos que ese control ya tiene una opción elegida
                        if (Rbl.SelectedItem != null && Contador[IdControl - 1] == 0)
                        {
                            Contador[IdControl - 1] = 1;
                            nControlesOn++;
                        }
                    }
                    //Actualizamos el número de controles elegidos en el label
                    LblControl.Text = nControlesOn.ToString();
                    //Guardamos en la variable de sesión
                    Session["nControlesOn"] = nControlesOn;
                    Session["CheckList"] = CheckList;
                    //Si están elegidos todos los controles activamos el botón de insertar
                    if (nControlesOn == 133)
                    {
                        BtnInsertar.Enabled = true;
                    }
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar el valor de un control. ");
                PnlGV.Visible = false;
            }

        }

        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                int IdEmpresa = DatosEmpresa();
                if (IdEmpresa != -1)
                {
                    //Recogemos la lista que contiene que controles han sido elegidos 
                    List<int> Contador = (List<int>)Session["Contador"];
                    ArrayList valores = new ArrayList();
                    //Recogemos la lista con el valor de los controles que han sido elegidos
                    List<ControlesCheckList> CheckList = (List<ControlesCheckList>)Session["Checklist"];
                    //Recorremos el Gridview antes de cambiar de página
                    foreach (GridViewRow row in GridView1.Rows)
                    {
                        //Recogemos el control RadioButtonList de cada fila
                        RadioButtonList Rbl = (RadioButtonList)row.FindControl("RadioButtonList1");
                        //Si está seleccionado
                        if (Rbl.SelectedItem != null)
                        {
                            //Recogemos el IdControl de la fila
                            int IdControl;
                            int.TryParse(GridView1.Rows[row.RowIndex].Cells[1].Text, out IdControl);
                            //Actualizamos el valor de contador
                            Contador[IdControl - 1] = 1;
                            //Recogemos el control, el valor seleccionado y el nivel de madurez al que pertenece ese control
                            String Control = GridView1.Rows[row.RowIndex].Cells[3].Text;
                            String ValorSelec = Rbl.SelectedItem.Text;
                            int NivelMadurez;
                            int.TryParse(GridView1.Rows[row.RowIndex].Cells[5].Text, out NivelMadurez);
                            //Creamos el objeto ControlCheckList con los valores y lo insertamos en la lista
                            ControlesCheckList ControlChequeado = new ControlesCheckList(IdEmpresa, IdControl, ValorSelec, NivelMadurez);
                            CheckList[IdControl - 1] = ControlChequeado;
                        }
                    }
                    //Actualizamos la variable de sesión
                    Session["Contador"] = Contador;
                    //Pasamos a la nueva página que se ha seleccionado
                    this.GridView1.PageIndex = e.NewPageIndex;
                    Session["CheckList"] = CheckList;
                    //Recuperamos los controles asociados a esa página seleccionada
                    List<Controles> LControles = ControlesFactory.RecogeControles();
                    GridView1.DataSource = LControles;
                    DataBind();
                    //Cargamos el valor de los controles que estuvieran seleccionados anteriormente
                    for (int i = 0; i < CheckList.Count; i++)
                    {
                        ControlesCheckList controlLista = CheckList[i];
                        foreach (GridViewRow row in GridView1.Rows)
                        {
                            int IdControl;
                            int.TryParse(GridView1.Rows[row.RowIndex].Cells[1].Text, out IdControl);
                            if (IdControl == controlLista.IdControl)
                            {
                                RadioButtonList Rbl = (RadioButtonList)row.FindControl("RadioButtonList1");
                                switch (controlLista.ValorControl)
                                {
                                    case "SI":
                                        Rbl.Items[0].Selected = true;
                                        break;
                                    case "NO":
                                        Rbl.Items[1].Selected = true;
                                        break;
                                    case "PARC":
                                        Rbl.Items[2].Selected = true;
                                        break;
                                    case "N/A":
                                        Rbl.Items[3].Selected = true;
                                        break;
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar la tabla con los elementos seleccionados");
            }
        }

        //Inserta los controles en la base de datos, así como calcula el nivel de madurez actual según la respuestas de los mismos
        protected void BntControl_Click(object sender, EventArgs e)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            int IdEmpresa = DatosEmpresa();
            if (IdEmpresa != -1)
            {
                int MadurezActualEmpresa = 0;
                List<ControlesCheckList> ValoresControles = (List<ControlesCheckList>)Session["Checklist"];
                try
                {
                    MadurezActualEmpresa = EmpresasNegocio.CalcularNivelMadurezActualEmpresa(ValoresControles, IdEmpresa);
                    EmpresasFactory.InsertarNivelMadurezActual(IdEmpresa, MadurezActualEmpresa);
                    ControlesEmpresaNegocio.InsertarControlesEmpresa(ValoresControles);
                    MuestraMensajeRedirige("Nivel de Madurez Actual Insertado Correctamente.", "EmpresaNivMadurezPrincipal");
                }
                catch (Exception e1)
                {
                    e1.ToString();
                    MuestraMensaje("Error en la Ejecución del Algoritmo. " + e1.Message);
                    PnlGV.Visible = false;
                }
            }
        }

        private int DatosEmpresa()
        {
            try
            {
                int IdEmpresa = -1;
                String nombreUsuario = (String)Session["nombreUsuario"];
                IdEmpresa = UsuariosFactory.EmpresaUsuario(nombreUsuario);
                if (IdEmpresa == 0)
                {
                    MuestraMensaje("El usuario " + nombreUsuario + " no esta asociado a una empresa");
                    return -1;
                }
                else
                {
                    return IdEmpresa;
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                Session.Abandon();
                MuestraMensajeRedirige("Error al recoger la variable de sesión. La aplicación se cerrará por motivos de seguridad", "InicioSesion");
                return -1;
            }
        }

        private void MuestraMensajeRedirige(string Mensaje, string Pagina)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            SB.Append("var vers = navigator.appVersion;if(vers.indexOf('MSIE 7.0') != -1) { window.location='" + Pagina + ".aspx';} else{ window.location='" + Pagina + ".aspx'; }");
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Success", SB.ToString(), true);
        }

        private void MuestraMensaje(string Mensaje)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Success", SB.ToString(), true);
        }
    }
}